package com.example.informationEntry.service.impl;

import com.example.informationEntry.dao.NaUserTokenDao;
import com.example.informationEntry.entity.NaUserToken;
import com.example.informationEntry.service.NaUserTokenService;
import com.example.informationEntry.util.ConstantParam;
import com.example.informationEntry.util.UtilMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * 管理员token表(NaUserToken)表服务实现类
 *
 * @author makejava
 * @since 2019-04-09 20:08:06
 */
@Service("naUserTokenService")
public class NaUserTokenServiceImpl implements NaUserTokenService {
    @Resource
    private NaUserTokenDao naUserTokenDao;


    private static Logger log = LoggerFactory.getLogger(NaUserTokenServiceImpl.class);

    /**
     * 通过ID查询单条数据
     *
     * @param userPhone 主键
     * @return 实例对象
     */
    @Override
    public NaUserToken queryById(String userPhone) {
        return this.naUserTokenDao.queryById(userPhone);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<NaUserToken> queryAllByLimit(int offset, int limit) {
        return this.naUserTokenDao.queryAllByLimit(offset, limit);
    }

    /**
     * 查询多条数据
     *
     * @param naUserToken 实例对象
     * @return list集合
     */
    @Override
    public List<NaUserToken> queryAll(NaUserToken naUserToken){
        return this.naUserTokenDao.queryAll(naUserToken);
    }


    /**
     * 新增数据
     *
     * @param naUserToken 实例对象
     * @return 实例对象
     */
    @Override
    public NaUserToken insert(NaUserToken naUserToken) {
        this.naUserTokenDao.insert(naUserToken);
        log.info("新增token成功");
        return this.queryById(naUserToken.getUserPhone());
    }

    /**
     * 修改数据
     *
     * @param naUserToken 实例对象
     * @return 实例对象
     */
    @Override
    public NaUserToken update(NaUserToken naUserToken) {
        this.naUserTokenDao.update(naUserToken);
        return this.queryById(naUserToken.getUserPhone());
    }

    /**
     * 通过主键删除数据
     *
     * @param userPhone 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(String userPhone) {
        return this.naUserTokenDao.deleteById(userPhone) > 0;
    }


    /**
     * 判断token是否有效 ， 进行存库 ， 比对 ， 更新
     *
     * @param paraMap 传递的参数
     * @return
     */
    @Override
    public boolean tokenVerification(Map<String,String> paraMap) {
        log.info("进行token验证");
        NaUserToken naUserToken = new NaUserToken();
        naUserToken.setUserPhone(paraMap.get("userName"));
        naUserToken.setToken(paraMap.get("token"));
        if (naUserToken.getUserPhone() != null) {
            NaUserToken token = this.queryById(naUserToken.getUserPhone());
            if (token == null) {
                log.info("账号不存在与token库，请检查账号");
                return true;
            }
            if (naUserToken.getToken().equals(token.getToken())) {
                log.info("token验证一致，进行时间有效性验证");
                if (UtilMethod.unixLong() - token.getTokenTime() <= ConstantParam.PARAM_THIRTY_MINUTES) {
                    log.info("更新token时间");
                    token.setTokenTime(UtilMethod.unixLong());
                    this.update(token);
                    return false;
                } else {
                    log.info("token已过期，请重新登录获取token，过期时间："
                            + ((UtilMethod.unixLong() - token.getTokenTime())
                            - ConstantParam.PARAM_THIRTY_MINUTES));
                    return true;
                }
            } else {
                log.info("token验证不一致，存储数据库的token为：" + token.getToken());
                log.info("token验证不一致，传递的的token为：" + naUserToken.getToken());
                return true;
            }
        } else {
            log.info("账号为空，token验证失败");
            return true;
        }
    }

    /**
     * 测试使用禁用token方式，正式需放开上面的方法删掉此方法
     *
     * @param paraMap 实例对象
     * @return
     */
    /*@Override
    public boolean tokenVerification(Map<String,String> paraMap) {
        return false;
    }*/
}